package com.caifu.util;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * <p>列表排序，按照树结构排序list（顶级无父节点）<p>
 * 排序前：122,13,121,1,131,12,132...
 * 无序的
 * [TestSort [id=122, name=三级b, parentid=12], TestSort [id=13, name=二级b, parentid=1], TestSort [id=121, name=三级a, parentid=12], TestSort [id=1, name=一级, parentid=null], TestSort [id=131, name=三级c, parentid=13], TestSort [id=12, name=二级a, parentid=1], TestSort [id=132, name=三级d, parentid=13]]
 * 
 * 排序后：1,13,131,132,12,122,121...
 * 按照树结构排序
 * [TestSort [id=1, name=一级, parentid=null], TestSort [id=13, name=二级b, parentid=1], TestSort [id=131, name=三级c, parentid=13], TestSort [id=132, name=三级d, parentid=13], TestSort [id=12, name=二级a, parentid=1], TestSort [id=122, name=三级b, parentid=12], TestSort [id=121, name=三级a, parentid=12]]
 * @version 1.0
 * @author li_hao
 * @date 2018年4月12日
 */
public class OrgTypeSort {

	private List<Map<String,Object>> resultList = new ArrayList<>();  //输出列表
	private List<Map<String,Object>> orgList;  //输入列表

	/**
	 * 排序
	 */
	public OrgTypeSort(List<Map<String,Object>> orgList, Long orgId,String str){
		this.orgList = orgList;
		
		for(Map<String,Object> map : this.orgList){
			if(orgId!=null) {
				if((long)map.get("orgId")==orgId) {
					resultList.add(map);  //当父级为空时即顶级，首先放入输出列表
					findChildren(map);  //查询下级
				}	
			}else {
				if(map.get("parentOrgId")==null) {
					resultList.add(map);  //当父级为空时即顶级，首先放入输出列表
					findChildren(map);  //查询下级
				}
			}
			
			
			/*String a = ((BigDecimal)map.get("parentOrgId")).toString();
			if(StringUtils.isBlank(a)){  //当父级为空
				resultList.add(map);  //当父级为空时即顶级，首先放入输出列表
				findChildren(map);  //查询下级
			}*/
		}
	}
	
	/**
	 * 查询下级
	 */
	private void findChildren(Map<String,Object> map){
		List<Map<String,Object>> childrenList = new ArrayList<>();
		//遍历输入列表，查询下级
		for(Map<String,Object> smap : orgList){
			if(Objects.equals(map.get("orgId"), smap.get("parentOrgId")))
				childrenList.add(smap);
		}
		//遍历到最末端，无下级，退出遍历
		if(childrenList.isEmpty()){
			return;
		}
		//对下级进行遍历
		for(Map<String,Object> d : childrenList){
			resultList.add(d);
			findChildren(d);
		}
	}

	//第一个参数，需要生成树的数组，第二个参数为树的根节点
	public static JSONObject  getJsontree(JSONArray json,JSONObject job,String str){
	   JSONArray tempJson = JSONArray.fromObject("[]");
	   //筛选出父id等于job里面id的科室
	   for(int i = 0;i < json.size();i++)       
	   {  
	   	  //这里可以使用Iterator      
	      if(json.getJSONObject(i).get("parentOrgId").equals(job.get("orgId"))) {
				String orgId = json.getJSONObject(i).get("orgId")+"";
				if(str.indexOf(orgId)!=-1){
					tempJson.add(json.getJSONObject(i));
				}
	      };       
	   }
	   // 优化，减少科室集合的数量，避免重复查询，有再优化的方法，希望告知。。
	   json.removeAll(tempJson);
	   for(int i = 0;i < tempJson.size(); i ++) {
	   	  //对第二层进行递归，此处类推
	      getJsontree(json, tempJson.getJSONObject(i),str);
	   }
	   //生成完的树结构map集合加到根节点
	   if(tempJson.size()!=0)
	      job.put("children", tempJson);
	   return job; 
	}
	
	
	public List<Map<String,Object>> getResultList(){
		return resultList;
	}
	
	public static List<Map<String,Object>> sort(List<Map<String,Object>> originalList, Long orgId, String str){
		return new OrgTypeSort(originalList, orgId, str).getResultList();
	}
	

	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		String arr = "10,100,101,105,10,100,101,105,106,10,100,101,105,106,107";
		String[] test1 = arr.split(",");
		ArrayList list = new ArrayList();
		for (int i = 0; i < test1.length; i++) {
			if (!list.contains(test1[i]))
				list.add(test1[i]);
		}
		String str = list.toString().replaceAll("\\[","").replaceAll("\\]","")+",";
		System.out.println(str);
	}

	//去重
	public static String arrDisitinct(String arr){
		if(arr!=null && arr.length()>0){
			String[] test1 = arr.split(",");
			ArrayList list = new ArrayList();
			for (int i = 0; i < test1.length; i++) {
				if (!list.contains(test1[i]))
					list.add(test1[i]);
			}
			String str = list.toString().replaceAll("\\[","").replaceAll("\\]","")+",";
			return str;
		}else{
			return arr;
		}
	}
}